package recom

import (
	"buyChance"
	"r_log"
	"tp"
	"util"
)

//l: 确认池level
func checkall(bcs *buyChance.BuyChances, pc tp.PointChange, stkid util.StkID, l util.Level) *buyChance.BuyChance {
	//检查该股票是否有预警信号
	bc, ok := (bcs.BcMap)[stkid]
	if !ok {
		r_log.RecomLogger.Info("stkid(%v): not in buychances", stkid)
		return nil
	}
	if bc.Level+l > 3 { //判断滤网级别是否符合确认池级别要求
		r_log.RecomLogger.Info("stkid(%v): filter level not match! bc.level=%v, user pool level=%v", stkid, bc.Level, l)
		return nil
	}
	if checkpart(bc, pc, stkid) {
		return nil
	}
	return bc
}

func checkpart(bc *buyChance.BuyChance, pc tp.PointChange, stkid util.StkID) bool {
	//todo 判断是否是非创业板或者是创业板且用户有创业板权限
	if pc.Acc.CYBTag == 0 && bc.IsCY {
		return true
	}
	//todo 判断是否是非科创板或者是创业板且用户有科创板权限
	if pc.Acc.KCBTag == 0 && bc.IsKC {
		return true
	}

	//检查股票的持仓情况是否不符合推荐标准
	if pc.Acc.CheckHolding(stkid) {
		return true
	}
	//检查预警信号的滤网级别是否不匹配用户级别对滤网的需求
	if checkLevel(bc, pc) {
		r_log.RecomLogger.Info("stkid(%v): filter level not match! bc.level=%v, tp.level=%v, tp.convState=%v, style=%v", stkid, bc.Level, pc.Level, pc.ConvState, pc.Acc.Style)
		return true
	}

	return false
}

//检查当前是否存在该股票有效的推荐,存在返回true，符合返回false
func (rr *RecommenderResultsInOneDay) checkDuplicateRecom(stkid util.StkID) bool {
	if p, ok := (*rr)[stkid]; ok {
		r_log.RecomLogger.Info("stkid(%v): has been recomed before in period %v", stkid, p)
		return true
	}

	return false
}

/*complexLogic
滤网级别
A	非常严格
B	严格
C	一般
D	宽松

账户和滤网匹配表
e1账户评级D，稳健，不收敛B正常收敛A极端收敛A。
e2账户评级D，激进，不收敛C正常收敛A极端收敛A 。

f1账户评级C(盈利没碰保赢），稳健，不收敛B正常收敛B极端收敛B。
f2账户评级C(盈利没碰保赢），激进，不收敛C正常收敛C极端收敛C。

g1账户评级B(碰过获利保赢且在之下），稳健，不收敛D正常收敛B极端收敛A。
g2账户评级B(碰过获利保赢且在之下），激进，不收敛D正常收敛C极端收敛B。

h1账户评级A(获利保赢之上），稳健，不收敛D正常收敛B极端收敛A。
h2账户评级A(获利保赢之上），激进，不收敛D正常收敛C极端收敛B。
*/
func checkLevel(bc *buyChance.BuyChance, pc tp.PointChange) bool {
	style := pc.Acc.Style
	return bc.Level > util.Filters[pc.Level][style-1][pc.ConvState]
}
